const fs = require('fs');
const path = require('path');
const readline = require('readline');
const translateText = require('./translate');

/**
 * 处理文件，逐行翻译并写入输出文件
 * @param {string} filePath - 输入文件路径
 * @param {string} outputPath - 输出文件路径
 * @param {number} startLine - 起始行数（从0开始）
 * @param {number} linesToProcess - 需要处理的行数
 * @returns {Promise<Object>} - 处理结果统计
 */
async function processFile(filePath, outputPath, startLine, linesToProcess) {
  startLine = startLine || 0;
  linesToProcess = linesToProcess || Infinity;

  // 检查文件是否存在
  if (!fs.existsSync(filePath)) {
    throw new Error(`输入文件不存在: ${filePath}`);
  }

  // 创建输出目录（如果不存在）
  const outputDir = path.dirname(outputPath);
  if (outputDir && outputDir !== '.' && !fs.existsSync(outputDir)) {
    fs.mkdirSync(outputDir, { recursive: true });
  }

  // 直接读取整个文件内容
  const fileContent = fs.readFileSync(filePath, 'utf8');
  // 根据换行符分割成行数组（兼容不同操作系统的换行符）
  const lines = fileContent.split(/\r?\n/);
  
  // 创建写入流
  const writeStream = fs.createWriteStream(outputPath, { flags: 'w' });
  
  let processedCount = 0;
  let successCount = 0;
  let failCount = 0;
  
  console.log(`开始处理文件: ${filePath}`);
  console.log(`文件总行数: ${lines.length}`);
  console.log(`起始行: ${startLine}, 计划处理行数: ${linesToProcess}`);

  // 计算实际要处理的行范围
  const endLine = Math.min(startLine + linesToProcess, lines.length);
  
  return new Promise((resolve, reject) => {
    // 使用异步处理每一行
    (async () => {
      try {
        for (let i = startLine; i < endLine; i++) {
          const line = lines[i];
          const trimmedLine = line ? line.trim() : '';
          
          if (!trimmedLine) {
            writeStream.write('\n');
            processedCount++;
            continue;
          }

          try {
            // 尝试解析JSON
            let json;
            try {
              json = JSON.parse(trimmedLine);
            } catch (error) {
              console.error(`第 ${i + 1} 行JSON解析失败: ${error.message}`);
              writeStream.write(trimmedLine + '\n');
              failCount++;
              processedCount++;
              continue;
            }

            // 检查是否需要翻译
            if (json.user || json.assistant) {
              try {
                const translatedText = await translateText(JSON.stringify(json));
                if (translatedText) {
                  // 确保翻译后的文本是有效的JSON
                  try {
                    JSON.parse(translatedText);
                    writeStream.write(translatedText + '\n');
                    successCount++;
                  } catch (error) {
                    console.error(`第 ${i + 1} 行翻译结果不是有效JSON: ${error.message}`);
                    writeStream.write(trimmedLine + '\n'); // 使用原始文本
                    failCount++;
                  }
                } else {
                  console.error(`第 ${i + 1} 行翻译失败`);
                  writeStream.write(trimmedLine + '\n'); // 翻译失败，保留原行
                  failCount++;
                }
              } catch (error) {
                console.error(`第 ${i + 1} 行翻译过程出错: ${error.message}`);
                writeStream.write(trimmedLine + '\n');
                failCount++;
              }
            } else {
              // 无需翻译的行直接写入
              writeStream.write(trimmedLine + '\n');
            }
          } catch (error) {
            console.error(`第 ${i + 1} 行处理出错: ${error.message}`);
            writeStream.write(trimmedLine + '\n');
            failCount++;
          }

          // 每处理100行输出一次进度
          processedCount++;
          if (processedCount % 100 === 0) {
            console.log(`已处理 ${processedCount} 行，成功: ${successCount}，失败: ${failCount}`);
          }
        }
        
        // 完成处理
        writeStream.end();
        console.log(`处理完成! 总共处理: ${processedCount} 行，成功: ${successCount}，失败: ${failCount}`);
        resolve({ total: processedCount, success: successCount, fail: failCount });
      } catch (err) {
        writeStream.end();
        reject(err);
      }
    })();

    writeStream.on('error', (err) => {
      console.error('写入文件出错:', err.message);
      reject(err);
    });
  });
}

module.exports = processFile;